function PricePath_M = merton_jump_diffusion(S0, mu, sigma, muJ, sigmaJ, lambda, T, Nstep, Ntraj)
%%%%%%%%%%%%%%%%%%%%%%%函数说明%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 用途：产生服从Merton跳跃扩散过程的标的资产价格路径
%模型缺点：lambda*dt要求是比较小的值，如此在dt时间段内跳跃次数超过1的可能性极小。
% 如果lambda*dt取值较大则会产生较大误差。
% 输入参数：
% S0: 初始资产价格; r: 无风险利率; sigma: 波动率; muJ: 跳跃事件平均增长率
% sigmaJ: 跳跃事件波动率; lambda: 跳跃事件强度; T: 时间跨度; Nstep: 时间步长
% Ntraj: 模拟路径数量
% 输出参数：
% PricePath_M: 模拟路径

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%dS = μS dt + σS dW + dJ;
%St = S(t-1) * exp((r - 0.5 * sigma^2) * dt + sigma * dW + J);
    dt = T / Nstep;
    %randn('seed', 666);%如确保每次运行程序时生成的随机数序列是相同的去掉改行%
    %%计算增加量
    dW = sqrt(dt) * randn(Nstep, Ntraj);
    dN = poissrnd(lambda * dt, Nstep, Ntraj);%生成每个时间段内的跳跃次数
    J0 = normrnd(muJ, sigmaJ, [Nstep, Ntraj]); % 使用正态分布生成跳跃的大小
    J = J0.*(dN); % 每个时期所对应的跳跃量
    Increments = (mu - 0.5 * sigma^2) .* dt + sigma .* dW + J;%增量
    % 计算对数价格
    LogPrice=cumsum([log(S0)*ones(1,Ntraj); Increments]);
    %计算价格
    PricePath_M=exp(LogPrice);%每一行是一次模拟的价格路径
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%价格路径可视化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
plot(PricePath_M)
title('Simulation of Price Path')
ylabel('Asset Price');
xlabel('Time Step');
xlim([0,Nstep]);
end